package com.itheima.pxgl.interceptor;

import com.itheima.pxgl.common.constant.JwtClaimsConstant;
import com.itheima.pxgl.common.context.BaseContext;
import com.itheima.pxgl.common.properties.JwtProperties;
import com.itheima.pxgl.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * Jwt校验技术
 */

/**
 * 实现HandlerInterceptor接口可以帮助我们拦截HTTP请求，并在请求处理之前、之后、以及完成之后执行自定义的逻辑。
 * 这种拦截能力在多种场景下都非常有用，比如身份认证、权限控制、日志记录等。
 */
@Component
@Slf4j
public class JwtTokenAdminInterceptor implements HandlerInterceptor {
    @Autowired
    private JwtProperties jwtProperties;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        判断当前请求的是静态资源还是动态资源
        if(!(handler instanceof HandlerMethod)){
            log.info("当前方位的为静态资源");
            return  true;
        }
//        获得token
        String token = request.getHeader( jwtProperties.getAdminTokenName()) ;
//        判断是否携带token却判断是否是一致的
//        检验令牌
        try {
            log.info("jwt校验:{}", token);
            Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
            Long userId = Long.parseLong(claims.get(JwtClaimsConstant.EMP_ID).toString());
            log.info("当前用户id：{}",userId);
            BaseContext.setCurrentId(userId);
            return true;
        }catch (Exception ex) {
            //4、不通过，响应401状态码
            response.setStatus(401);
            return false;
        }
    }
}
